/**
 * 
 */
package mm.back.dao.impl;

import genericos.dao.exeptions.PersistanceException;
import genericos.dao.exeptions.PersistenceServiceException;

import java.util.List;

import mm.back.dao.MMAbstractDAO;
import mm.back.dao.VendedorDAO;
import mm.back.entity.Vendedor;
import mm.back.filtros.VendedoresFiltro;
import mm.exceptions.MMGenericException;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.springframework.stereotype.Repository;

/**
 * @author PUSDERKIS
 *
 */
@Repository("vendedorDAO")
public class VendedorDAOImpl extends MMAbstractDAO implements VendedorDAO {

	/** 
	 * @see mm.back.dao.VendedorDAO#getVendedor(java.lang.Long)
	 */
	public Vendedor getVendedor(Long idVendedor) throws MMGenericException {
		
		
		try{
			
			if (logger.isDebugEnabled()){
				logger.debug("Se cargara el vendedor #"+idVendedor);
			}
			
			Vendedor v = (Vendedor) universalHibernateDAO.getHibernateSession().get(Vendedor.class, idVendedor);
			
			if (logger.isDebugEnabled()){
				if (v == null){
					logger.debug("No se encontro el vendedor #"+idVendedor);
				} else {
					logger.debug("Se recupero el vendor #"+idVendedor+" con exito.");
				}
			}
			
			return v;
		} catch (PersistenceServiceException e) {
			logger.error("Error al recuperar el vendedor #"+idVendedor,e);
			throw new MMGenericException("Error al recuperar el usuario", e);
		} catch (HibernateException e) {
			logger.error("Error al recuperar el vendedor #"+idVendedor,e);
			throw new MMGenericException("Error al recuperar el vendedor #"+idVendedor, e);
		} catch (PersistanceException e) {
			logger.error("Error al recuperar el vendedor #"+idVendedor,e);
			throw new MMGenericException("Error al recuperar el usuario", e);
		}
	}

	public List<Vendedor> searchVendedores(VendedoresFiltro filtro)
			throws MMGenericException {
		try{
			
			if (logger.isDebugEnabled()){
				logger.debug("Buscando la lista de vendedores...");
			}
			
			StringBuffer sQuery = new StringBuffer("FROM Vendedor v where 1=1 ");
			sQuery.append(filtro.getWhereClause("v"));
			
			Query q = universalHibernateDAO.getHibernateSession().createQuery(sQuery.toString());
			
			filtro.setWhereParameters(q);
			
			@SuppressWarnings("unchecked")
			List<Vendedor> vList = q.list();
			
			if (logger.isDebugEnabled()){
				logger.debug("se cargaron "+ vList.size() + " vendedores.");
			}
			
			return vList;
		} catch (PersistenceServiceException e) {
			logger.error("Error al recuperar el listado de vendedores",e);
			throw new MMGenericException("Error al recuperar el listado de vendedores", e);
		} catch (HibernateException e) {
			logger.error("Error al recuperar el listado de vendedores",e);
			throw new MMGenericException("Error al recuperar el listado de vendedores", e);
		} catch (PersistanceException e) {
			logger.error("Error al recuperar el listado de vendedores",e);
			throw new MMGenericException("Error al recuperar el listado de vendedores", e);
		}
	}

	/**
	 * @see VendedorDAO#saveVendedor(Vendedor)
	 */
	public void saveVendedor(Vendedor vendedor) throws MMGenericException {
		
		try{
			if (logger.isDebugEnabled()){
				logger.debug("Se intenta guardar el vendedor...");
			}
			universalHibernateDAO.saveOrUpdate(vendedor);
			if(logger.isDebugEnabled()){
				logger.debug("Vendedor guardado con exito. ID: "+vendedor.getId());
			}
			
		} catch (PersistenceServiceException e) {
			logger.error("Fallo al insertar el vendedor en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		}
		
	}

	/**
	 * @see mm.back.dao.VendedorDAO#createVendedor(mm.back.entity.Vendedor)
	 */
	public void createVendedor(Vendedor vendedor) throws MMGenericException {
		try{
			if (logger.isDebugEnabled()){
				logger.debug("Se intenta crear el vendedor...");
			}
			universalHibernateDAO.save(vendedor);
			if(logger.isDebugEnabled()){
				logger.debug("Vendedor creado con exito. ID: "+vendedor.getId());
			}
			
		} catch (PersistenceServiceException e) {
			logger.error("Fallo al insertar el vendedor en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		}
	}

}
